home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / STRINGS.SWG / 0097_FASTEST Uppercase.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  3KB  |  82 lines

  1.  
  2.    (*
  3.  
  4.    For the SWAGS...
  5.  
  6.    To the best of my knowledge this is the fastest routine for 
  7.    up/low-casing strings in Turbo Pascal. The difference from 
  8.    previous versions is that it uses seges for segment override 
  9.    and within the loop it replaces loadsb and stosb with mov 
  10.    operations. It is also independent from the segment in which 
  11.    Source and Table are created. 
  12.    
  13.    If anyone finds a bug or has a suggestion, or has a faster 
  14.    looking routine for string translations, just leave me a 
  15.    message here. I'll benchmark the new routine against the 
  16.    collection I have gathered already from the SWAGS and 
  17.    elsewhere and will post the results. 
  18.  
  19.    The following benchmarking was done in a 486/DX 60 MHz using 
  20.    Neil Rubenking's TimeTick unit while upcasing a full string 
  21.    (255 chars) 400,000 times (100 million characters): 
  22.  
  23.    For-Do loop using TP7 UpCase() .......... 315.5 secs.
  24.    UpperCase (Assembler classical approach)   53.9 secs. (1)
  25.    My old TXlat3 ...........................  28.3 secs. (2)
  26.    Translate ...............................  26.8 secs. (3)
  27.    TXlat5 (the one in this message) ........  21.2 secs.
  28.  
  29.    (1) There are several routines using this approach in the 
  30.        SWAGS. See also HAX 144 in PC-Techniques. 
  31.    (2) See "St-case4.pas" in STRINGS.SWG, it contains an earlier 
  32.        (and buggy...) version.
  33.    (3) See "Translate upper/lower case" in STRINGS.SWG
  34.  
  35.    -Jose-
  36.    Jose Campione, 1:163.513.3
  37.    *)
  38.  
  39.     Program TXlate;
  40.  
  41.     type
  42.       ByteArray = array[0..255] of byte;
  43.     var
  44.       Source  : string;
  45.       Table   : ByteArray;
  46.       i       : byte;
  47.  
  48.     Procedure TXlat5(var Source: string; var Table: ByteArray);assembler;
  49.     asm
  50.         mov  dx, ds       { save ds }
  51.         lds  bx,Table     { load ds:bx with Table address }
  52.         les  di,Source    { load es:di with Source address }
  53.         seges             { override ds segment}
  54.         mov  al,[di]      { load al with length of source }
  55.         xor  ah, ah       { set ah to zero, we need a word for cx }
  56.         mov  cx,ax        { assign length of source to counter }
  57.         jcxz @end         { if cx = 0 exit}
  58.         inc  di           { increment di & skip length byte on 1st pass }
  59.       @filter:
  60.         mov  al,[di]      { load byte in ax from es:di }
  61.         xlat              { tan-xlat-e... }
  62.         mov  [di],al      { send byte to es:di }
  63.         inc  di           { increment di }
  64.         loop @filter      { decrement cx and loop back if cx > 0 }
  65.       @end: mov  ds, dx   { restore ds }
  66.     end;
  67.  
  68.     begin
  69.       {...}
  70.       {Fill Table for UpCase translation}
  71.       for i:= 0 to 255 do
  72.         if i in [$61..$7A] then Table[i]:= i - $20 else Table[i]:= i;
  73.       {...}
  74.       Source: 'this string is to be upcased ';
  75.       WriteLn(Source);
  76.       TXlat5(Source,Table);
  77.       WriteLn(Source);
  78.       {...}
  79.     end.
  80.  
  81.    
  82.